home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / T U R B O Language / Turbo Pascal V7.0 / DOCDEMO.ZIP / STREAM2.PAS < prev    next >
Pascal/Delphi Source File  |  1992-10-30  |  7KB  |  287 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Vision 2.0 Demo                        }
  4. {   Copyright (c) 1992 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. { Load and display a collection of graphical objects from a
  9.   stream: Points, Circles, Rectangles. This collection was
  10.   created and put on a stream by another program
  11.   (STREAM1.PAS).
  12.  
  13.   If you are running this program in the IDE, be sure to enable
  14.   the full graphics save option when you load TURBO.EXE:
  15.  
  16.     turbo -g
  17.  
  18.   This ensures that the IDE fully swaps video RAM and keeps
  19.   "dustclouds" from appearing on the user screen when in
  20.   graphics mode. You can enable this option permanently
  21.   via the Options|Environment|Startup dialog.
  22.  
  23.   This program uses the Graph unit and its .BGI driver files to
  24.   display graphics on your system. The "PathToDrivers"
  25.   constant defined below is set to \TP\BGI, which is the default
  26.   location of the BGI files as installed by the INSTALL program.
  27.   If you have installed these files in a different location, make
  28.   sure the .BGI file for your system (EGAVGA.BGI, etc.) is in the
  29.   current directory or modify the "PathToDrivers" constant
  30.   accordingly.
  31. }
  32.  
  33. program STREAM2;
  34.  
  35. uses
  36.   Objects, Graph;
  37.  
  38. const
  39.   PathToDrivers = '\TP\BGI';  { Default location of *.BGI files }
  40.  
  41. { ********************************** }
  42. { ******  Graphical Objects  ******* }
  43. { ********************************** }
  44.  
  45. type
  46.   PGraphObject = ^TGraphObject;
  47.   TGraphObject = object(TObject)
  48.     X,Y: Integer;
  49.     constructor Init;
  50.     constructor Load(var S: TStream);
  51.     procedure Draw; virtual;
  52.     procedure Store(var S: TStream); virtual;
  53.   end;
  54.  
  55.   PGraphPoint = ^TGraphPoint;
  56.   TGraphPoint = object(TGraphObject)
  57.     procedure Draw; virtual;
  58.   end;
  59.  
  60.   PGraphCircle = ^TGraphCircle;
  61.   TGraphCircle = object(TGraphObject)
  62.     Radius: Integer;
  63.     constructor Init;
  64.     constructor Load(var S: TStream);
  65.     procedure Draw; virtual;
  66.     procedure Store(var S: TStream); virtual;
  67.   end;
  68.  
  69.   PGraphRect = ^TGraphRect;
  70.   TGraphRect = object(TGraphObject)
  71.     Width, Height: Integer;
  72.     constructor Init;
  73.     constructor Load(var S: TStream);
  74.     procedure Draw; virtual;
  75.     procedure Store(var S: TStream); virtual;
  76.   end;
  77.  
  78. { TGraphObject }
  79. constructor TGraphObject.Init;
  80. begin
  81.   X := Random(GetMaxX) div 2;
  82.   Y := Random(GetMaxY) div 2;
  83. end;
  84.  
  85. constructor TGraphObject.Load(var S: TStream);
  86. begin
  87.   S.Read(X, SizeOf(X));
  88.   S.Read(Y, SizeOf(Y));
  89. end;
  90.  
  91. procedure TGraphObject.Draw;
  92. begin
  93.   Abstract;     { Give error: This object should never be drawn }
  94. end;
  95.  
  96. procedure TGraphObject.Store(var S: TStream);
  97. begin
  98.   S.Write(X, SizeOf(X));
  99.   S.Write(Y, SizeOf(Y));
  100. end;
  101.  
  102. { TGraphPoint }
  103. procedure TGraphPoint.Draw;
  104. var
  105.   DX, DY: Integer;
  106. begin
  107.   { Make it a fat point so you can see it }
  108.   for DX := x - 2 to x + 2 do
  109.     for DY := y - 2 to y + 2 do
  110.       PutPixel(DX, DY, 1);
  111. end;
  112.  
  113. { TGraphCircle }
  114. constructor TGraphCircle.Init;
  115. begin
  116.   inherited Init;
  117.   Radius := 30 + Random(20);
  118. end;
  119.  
  120. constructor TGraphCircle.Load(var S: TStream);
  121. begin
  122.   inherited Load(S);
  123.   S.Read(Radius, SizeOf(Radius));
  124. end;
  125.  
  126. procedure TGraphCircle.Draw;
  127. begin
  128.   Circle(X, Y, Radius);
  129. end;
  130.  
  131. procedure TGraphCircle.Store(var S: TStream);
  132. begin
  133.   inherited Store(S);
  134.   S.Write(Radius, SizeOf(Radius));
  135. end;
  136.  
  137. { TGraphRect }
  138. constructor TGraphRect.Init;
  139. begin
  140.   inherited Init;
  141.   Width := 5 + Random(10) + X;
  142.   Height := 3 + Random(8) + Y;
  143. end;
  144.  
  145. constructor TGraphRect.Load(var S: TStream);
  146. begin
  147.   inherited Load(S);
  148.   S.Read(Width, SizeOf(Width));
  149.   S.Read(Height, SizeOf(Height));
  150. end;
  151.  
  152. procedure TGraphRect.Draw;
  153. begin
  154.   Rectangle(X, Y, X + Width, Y + Height);
  155. end;
  156.  
  157. procedure TGraphRect.Store(var S: TStream);
  158. begin
  159.   inherited Store(S);
  160.   S.Write(Width, SizeOf(Width));
  161.   S.Write(Height, SizeOf(Height));
  162. end;
  163.  
  164. { ********************************** }
  165. { **  Stream Registration Records ** }
  166. { ********************************** }
  167.  
  168. const
  169.   RGraphPoint: TStreamRec = (
  170.     ObjType: 150;
  171.     VmtLink: Ofs(TypeOf(TGraphPoint)^);
  172.     Load: @TGraphPoint.Load;
  173.     Store: @TGraphPoint.Store);
  174.  
  175.   RGraphCircle: TStreamRec = (
  176.     ObjType: 151;
  177.     VmtLink: Ofs(TypeOf(TGraphCircle)^);
  178.     Load: @TGraphCircle.Load;
  179.     Store: @TGraphCircle.Store);
  180.  
  181.   RGraphRect: TStreamRec = (
  182.     ObjType: 152;
  183.     VmtLink: Ofs(TypeOf(TGraphRect)^);
  184.     Load: @TGraphRect.Load;
  185.     Store: @TGraphRect.Store);
  186.  
  187.  
  188. { ********************************** }
  189. { ************  Globals ************ }
  190. { ********************************** }
  191.  
  192. { Abort the program and give a message }
  193.  
  194. procedure Abort(Msg: String);
  195. begin
  196.   Writeln;
  197.   Writeln(Msg);
  198.   Writeln('Program aborting');
  199.   Halt(1);
  200. end;
  201.  
  202. { Register all object types that will be put onto the stream.
  203.   This includes standard TVision types, like TCollection.
  204. }
  205.  
  206. procedure StreamRegistration;
  207. begin
  208.   RegisterType(RCollection);
  209.   RegisterType(RGraphPoint);
  210.   RegisterType(RGraphCircle);
  211.   RegisterType(RGraphRect);
  212. end;
  213.  
  214. { Put the system into graphics mode }
  215.  
  216. procedure StartGraphics;
  217. var
  218.   Driver, Mode: Integer;
  219. begin
  220.   Driver := Detect;
  221.   InitGraph(Driver, Mode, PathToDrivers);
  222.   if GraphResult <> GrOK then
  223.   begin
  224.     Writeln(GraphErrorMsg(Driver));
  225.     if Driver = grFileNotFound then
  226.     begin
  227.       Writeln('in ', PathToDrivers,
  228.         '. Modify this program''s "PathToDrivers"');
  229.       Writeln('constant to specify the actual location of this file.');
  230.       Writeln;
  231.     end;
  232.     Writeln('Press Enter...');
  233.     Readln;
  234.     Halt(1);
  235.   end;
  236. end;
  237.  
  238. { Use the ForEach iterator to traverse and
  239.   show all the collection of graphical objects.
  240. }
  241.  
  242. procedure DrawAll(C: PCollection);
  243.  
  244. { Nested, far procedure. Receives one
  245.   collection element--a GraphObject, and
  246.   calls that elements Draw method.
  247. }
  248.  
  249. procedure CallDraw(P: PGraphObject); far;
  250. begin
  251.   P^.Draw;                                   { Call Draw method }
  252. end;
  253.  
  254. begin { DrawAll }
  255.   C^.ForEach(@CallDraw);                     { Draw each object }
  256. end;
  257.  
  258. { ********************************** }
  259. { **********  Main Program ********* }
  260. { ********************************** }
  261.  
  262. var
  263.   GraphicsList: PCollection;
  264.   GraphicsStream: TBufStream;
  265. begin
  266.   StreamRegistration;                        { Register all streams }
  267.  
  268.   { Load collection from stream and draw it }
  269.   with GraphicsStream do
  270.   begin
  271.     Init('GRAPHICS.STM', stOpen, 1024);      { Open stream }
  272.     GraphicsList := PCollection(Get);        { Load collection }
  273.     Done;                                    { Shut down stream }
  274.     if Status <> 0 then                      { Check for error }
  275.       Abort('Error loading GRAPHICS.STM (run STREAM1.PAS first)');
  276.   end;
  277.  
  278.   StartGraphics;                             { Activate graphics }
  279.  
  280.   DrawAll(GraphicsList);                     { Use iterator to draw all }
  281.   Readln;                                    { Pause to view figures }
  282.  
  283.   { Clean up }
  284.   Dispose(GraphicsList, Done);               { Delete collection }
  285.   CloseGraph;                                { Shut down graphics }
  286. end.
  287.